home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_5.zip / adaed / nyudemos / new_maze.ada < prev    next >
Text File  |  1992-09-01  |  3KB  |  93 lines

  1. ----------------------------------------------------------------------
  2. --
  3. --                New_maze : create a new maze
  4. --
  5. --                      written by
  6. --
  7. --                   Edmond Schonberg
  8. --
  9. --                      Ada Project
  10. --                   Courant Institute
  11. --                  New York University
  12. --                   251 Mercer Street
  13. --                New York, New York  10012
  14. --
  15. -----------------------------------------------------------------------
  16.  
  17. with random_numbers; use random_numbers;
  18. with system;
  19. separate(maze)
  20. procedure new_maze(start, goal: position; num_lines: integer) is
  21.     -- create a new maze with a given number of paths, including two long ones 
  22.     -- that lead to source and destination.
  23.     pos: position;
  24.     d: direction ;
  25.     l: integer ;
  26.  
  27.     task type liner is
  28.         -- one is created for each path.
  29.         entry draw(pos: position; dir: direction; len: integer);
  30.     end liner;
  31.  
  32.     type new_liner is access liner ;
  33.     next_line: new_liner ;
  34.  
  35.     function max_len(p: position; d: direction) return integer is
  36.         -- establish distance from any point to boundary, 
  37.         -- along a given direction.
  38.     begin
  39.         case d is
  40.          when up    => return p.row ;
  41.          when right => return (80 - p.col) ;
  42.          when down  => return (23 - p.row) ;
  43.          when left  => return p.col ;
  44.         end case ;
  45.     end max_len;
  46.  
  47.     task body liner is
  48.         p: position ;
  49.         d: direction ;
  50.         l: integer;
  51.     begin
  52.         accept draw(pos: position; dir:direction; len: integer) do
  53.      p := pos ;
  54.      d := dir ;
  55.      l := len ;
  56.     end draw ;
  57.         for i in 1..l loop 
  58.           putc(' ', p.row, p.col) ;
  59.          dist(p.row, p.col) := max_dist ;
  60.          p := next_pos(p, d) ;
  61.         end loop ;
  62.     end liner ;
  63.  
  64. begin
  65.     clear ;
  66.     case SYSTEM.SYSTEM_NAME is
  67.     when SYSTEM.PC_DOS =>
  68.         fill_screen(ASCII.SI);
  69.     when others =>
  70.         fill_screen('#');
  71.     end case;
  72.     pos := start ;        -- first path starts at source.
  73.     d := up;            -- which is always on bottom row.
  74.     l := 20 ;
  75.     for i in 1..num_lines loop
  76.         -- create the right number of tasks, and start each at a random posi-
  77.         -- tion, going in a random direction towards the boundary.
  78.         next_line := new liner ;
  79.         next_line.draw(pos, d, l) ;
  80.         pos := (2*(1 + random_int(11)), 2*(1 + random_int(38))) ;
  81.         d := direction'val(random_int(40) mod 4) ;
  82.         l := max_len(pos, d) ;
  83.         l := l/2 + random_int(l/4) ;
  84.     end loop ;
  85.      -- One more for path leading to destination. (always on top row).
  86.     next_line := new liner ;
  87.     next_line.draw(goal, down, 22) ;
  88. exception
  89.     when storage_error | program_error  =>
  90.     puts("unable to create new tasks. Try simpler maze.", 23,1);
  91. end new_maze ;
  92.  
  93.